import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


# 基于iris数据集的实践
# STEP1 数据载入(sklearn自带iris数据集)
from sklearn.datasets import load_iris
data = load_iris() #得到数据特征
print(type(data))
iris_target = data.target #得到数据对应的标签
print(type(iris_target))#ndarray
print(type(data.data))#ndarray
print(type(data.feature_names))#list
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names)
print(iris_features)
print(iris_target)

#Step2:数据信息简单查看
iris_features.info()#info()方法查看df基本信息
iris_features.describe()#describe()方法查看df统计描述

#可视化
iris_all = iris_features.copy() #进行浅拷贝，防止对于原始数据的修改
iris_all['target'] = iris_target
print(iris_all)
## 特征与标签组合的散点可视化
sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')
plt.show()

#Step3:利用 逻辑回归模型 在三分类(多分类)上 进行训练和预测
#train_test_split()方法用于分隔数据集
from sklearn.model_selection import train_test_split
#设置20%的数据集为测试集
x_train, x_test, y_train, y_test = train_test_split(iris_features, iris_target, test_size = 0.2, random_state = 2020)

#定义 逻辑回归模型
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(random_state=0, solver='lbfgs')#定义回归模型
clf.fit(x_train, y_train)#训练回归模型

## 查看其对应的w
print('the weight of Logistic Regression:\n',clf.coef_)
## 查看其对应的w0
print('the intercept(w0) of Logistic Regression:\n',clf.intercept_)
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
## 由于逻辑回归模型是概率预测模型（前文介绍的 p = p(y=1|x,\theta)）,所有我们可以利用 predict_proba 函数预测其概率
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)

print('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为0类的概率，第二列代表预测为1类的概率，第三列代表预测为2类的概率。

## 利用accuracy（准确度）【预测正确的样本数目占总预测样本数目的比例】评估模型效果
from sklearn import metrics
print('The accuracy of the Logistic Regression is:', metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:', metrics.accuracy_score(y_test,test_predict))